package cn.xeblog.plugin.tools.read.ui;

import cn.xeblog.plugin.cache.DataCache;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.wm.StatusBar;
import com.intellij.openapi.wm.StatusBarWidget;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.openapi.wm.impl.status.IdeStatusBarImpl;
import com.intellij.util.Consumer;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.awt.*;
import java.awt.event.MouseEvent;

/**
 * 困难模式阅读器状态栏部件
 *
 * @author LYF
 * @date 2022-07-27
 */
public class HardReadWidget implements StatusBarWidget.TextPresentation, StatusBarWidget {
    /**
     * 部件id
     */
    private static final String ID = HardReadWidget.class.getName();
    /**
     * idea状态栏
     */
    private StatusBar myStatusBar;
    /**
     * 小说正文(在状态栏正文本就一行)
     */
    private String line = "";

    /**
     * 初始化状态栏
     *
     * @return 困难阅读器状态栏部件
     */
    public static HardReadWidget create() {
        // 困难模式阅读器状态栏部件
        return new HardReadWidget();
    }

    @Override
    public @NonNls
    @NotNull String ID() {
        // 状态栏部件id
        return ID;
    }

    @Override
    public @Nullable TextPresentation getPresentation() {
        // 文本演示
        return this;
    }

    /**
     * 注册状态栏
     */
    public void register() {
        line = "";
        // 获取状态栏
        IdeStatusBarImpl statusBar = (IdeStatusBarImpl) WindowManager.getInstance().getStatusBar(DataCache.project);
        // 将小部件添加到状态栏的左侧。请注意，当鼠标悬停在小部件上时，没有悬停效果。使用addWidget将小部件添加到状态栏的右侧，在这种情况下悬停效果是启用的。
        statusBar.addWidgetToLeft(this, DataCache.project);
    }

    @Override
    public void install(@NotNull StatusBar statusBar) {
        // 设置状态栏
        myStatusBar = statusBar;
        // 注册状态栏
        Disposer.register(myStatusBar, this);
    }

    @Override
    public void dispose() {
        // 如果已经初始化了，释放所有资源，即移除部件、状态栏、文本
        if (isInstalled()) {
            myStatusBar.removeWidget(ID);
            line = null;
            myStatusBar = null;
        }
    }

    /**
     * 是否安装
     *
     * @return true, 安装，否则，false
     */
    public boolean isInstalled() {
        // 状态栏内容不为空并且状态栏已经被初始化了
        return line != null && myStatusBar != null;
    }

    @Override
    public @NotNull String getText() {
        // 状态栏内容
        return line;
    }

    /**
     * 设置状态栏内容
     *
     * @param txt 状态栏内容
     */
    public void setText(String txt) {
        line = txt;
        // 通过id更新状态栏
        myStatusBar.updateWidget(ID);
    }

    @Override
    public float getAlignment() {
        // 左对齐
        return Component.LEFT_ALIGNMENT;
    }

    @Override
    public @Nullable String getTooltipText() {
        // 工具提示默认没有
        return null;
    }

    @Override
    public @Nullable Consumer<MouseEvent> getClickConsumer() {
        // 无点击事件
        return null;
    }
}
